name: Build and publish AppImages

on:
  push:
    tags:
      - "v*"

env:
  BASE_OS: ubuntu
  APT_PUBKEY: 871920D1991BC93C

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      fail-fast: true
      matrix:
        platform:
          - linux/amd64
          - linux/arm64
        codename:
          - jammy
          - lunar
          - mantic

    steps:
      - uses: actions/checkout@v4
      - uses: rlespinasse/github-slug-action@v4

      - name: Setup qemu for docker
        uses: docker/setup-qemu-action@v2
        if: matrix.platform != 'linux/amd64'

      - name: Setup buildx for docker
        uses: docker/setup-buildx-action@v2

      - name: Compile in docker
        uses: docker/build-push-action@v4
        with:
          platforms: ${{ matrix.platform }}
          outputs: build
          build-args: |
            BASE_OS
            BASE_CODENAME=${{ matrix.codename }}

      - name: Prepare environment to build AppImage
        env:
          TARGET_PLATFORM: ${{ matrix.platform }}
        shell: bash
        run: |
          set -eua
          if [ -r build/.build-metadata.env ]; then
            . build/.build-metadata.env
            rm build/.build-metadata.env
          fi
          APPIMAGE_SOURCE=build
          APPIMAGE_VERSION="${GITHUB_REF_SLUG}-${{ matrix.codename }}"
          APPIMAGE_APT_ARCH="${TARGETARCH}"
          APPIMAGE_APT_DISTRO="${{ matrix.codename }}"
          APPIMAGE_APT_PUBKEY="${APT_PUBKEY}"
          APPIMAGE_ARCH="${TARGETMACHINE}"
          printenv | grep ^APPIMAGE_ >>"${GITHUB_ENV}"

      - name: Build AppImage
        uses: AppImageCrafters/build-appimage@v1.3

      - name: Upload artifacts
        uses: actions/upload-artifact@v3
        with:
          name: appimages
          path: |
            ./*.AppImage
            ./*.AppImage.zsync
          if-no-files-found: error

  release:
    if: startsWith(github.ref, 'refs/tags/')
    runs-on: ubuntu-latest

    needs:
      - build

    permissions:
      contents: write

    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v3
        with:
          name: appimages
          path: assets
      - name: Create checksum for release assets
        shell: bash
        run: |
          algo="${SHA_ALGORITHM:-256}"
          find assets -type f | while read -r asset; do
            shasum --binary --algorithm "${algo}" "${asset}" >"${asset}.sha${algo}"
          done
      - name: Upload artifacts to GitHub release
        uses: softprops/action-gh-release@v1
        with:
          files: assets/*
